#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
const int N = 100009;
#define close(); std::ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
ll a[N], tr[N];//a是原数组,tr是树状数组

int n, m;

//每个数的间隔，背下来就行
ll lowbit(ll x)
{
    return x & -x;
}

//第x个数加上v
void add(ll x, ll v)
{
    //因为树状数组的性质，加一个数，只影响logn个数，所有不用全加完
    //从当前位置开始加，每个间隔是lowbit(i)，一直加到最后
    for (ll i = x; i <= n; i += lowbit(i))
        tr[i] += v;
}

//返回x的前缀和
ll qurry(ll x)
{
    //因为树状数组的性质，求前缀和，只用加logn个数，所有不用全加完
    //从当前位置开始累加，每个间隔是lowbit(i)，一直加到i==0停止
    ll cnt = 0;
    for (ll i = x; i != 0; i -= lowbit(i))
        cnt += tr[i];
    return cnt;
}

int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++)  cin>>a[i];//a[i]是原数组
        
    for (int i = 1; i <= n; i++) add(i, a[i]);//第i个数加上a[i],这样相当于更新树状数组

    while (m--)//m次查询
    {
        ll k, x, y;
        cin>>k>>x>>y;
        if (k == 2) cout<<qurry(y) - qurry(x - 1)<<'\n';//k是0表示查询x->y区间的前缀和,x-1是应为是要求 x->y
        else add(x, y);
    }
    return 0;

}
